package day3;

public class Main {
    public static void main(String args[]) {

            //learn0  构造器

            /*
             *   [修饰符]  构造器名（形参列表）{
             *
             *   }
             *
             *   构造器没有返回值  为什么不能用void?
             *   简单的说是语法规定。实际上构造函数是有返回值的，当使用new关键字来调用构造器时，构造器返回该类的实例，可以将这个类的实例当做构造器的返回值，
             *   因此构造器的返回值类型总是当前类，无需定义返回值类型。
             *
             *
             */


        // learn1   对象的产生和使用
            Person p;
            p = new Person();
            p.name = "jell";
            p.say("good man");

            // learn2  对象 引用  指针

            /*
            |  一个是p变量 一个是p对象
            |  堆内存放置p对象
            |  栈内存放置的是p变量
             */

            // learn3  对象的 this 引用    1.在方法中引用调用该方法的对象
            Dog dog = new Dog();
            dog.jump();
            dog.run();
            dog.run2();
            dog.run3();

            // learn4   static可以直接使用类来调用  在static修饰的方法中不能使用this引用   静态成员不能直接访问非静态成员
           StaticAccessNonStatic.test();


           //learn5  在构造器中的this
            System.out.println(new ThisInConstructor().foo);


            //learn6  可以将this当成普通方法的返回值
            ReturnThis rt = new ReturnThis();
            rt.grow().grow().grow();
            System.out.println("rt的age"+rt.age);

            //learn7  方法中值传递的参数机制  只有：值传递   所谓值传递，就是将实际参数的副本传递到函数里，而参数本身不收任何影响。

            new PrimitiveTransferTest().test(); // 基本类型的值传递
            new ReferenceTransferTest().test(); //引用类型的值传递


            //learn8 形参个数可变的方法
            new Varargs().run();


            // learn9 递归调用  自己调用自己
            System.out.println(Recursive.fn(10));


            //learn10 方法重载   可以定义多个同名的方法  只要方法的参数不同就可以
            Overload ol = new Overload();
            ol.test();
            ol.test("good-man");

            OverloadVarargs olv = new OverloadVarargs();
            olv.test();
            olv.test("a","b");

            olv.test("b");
            olv.test(new String[]{"a"});

            //learn11   成员变量和局部变量

            //成员变量：  [类变量 实例变量 两种]
            PersonTest.run();

            //局部变量  [形参  方法局部变量 代码块局部变量 三种]
            new VariableOverrideTest().run();


        CalendarTest.MyCalendar();

    }
}
